package com.codi.bus.core.service;

import com.codi.base.exception.BaseAppException;
import com.codi.bus.core.domain.Lookup;
import com.codi.bus.core.resultModel.CashChangeListResult;
import com.codi.bus.core.resultModel.ShareListResult;
import com.codi.bus.core.resultModel.WalletDetailResult;
import com.codi.bus.core.resultModel.WalletDetailResultV2;
import com.codi.bus.core.service.model.AssetFundModel;
import com.codi.fundData.domain.SecurityProduct;

import java.math.BigDecimal;
import java.util.List;

/**
 * 零钱包 相关接口
 *
 * @author song-jj
 */
public interface WalletService {

    /**
     * 查询零钱包详情
     *
     * @param token    用户token，可选
     * @param deviceId 设备ID，可选
     * @return 零钱包详情
     */
    WalletDetailResult getWalletDetail(String token, String deviceId) throws BaseAppException;

    /**
     * 查询零钱包详情
     *
     * @param userId 用户userId，可选
     * @return 零钱包详情
     */
    WalletDetailResultV2 getWalletDetailV2(Long userId) throws BaseAppException;

    void setFundName(AssetFundModel wallet, List<Lookup> lookups);

    /**
     * 查询零钱包详情
     *
     * @param userId 用户id，必选
     * @return 零钱包提現展示頁面
     */
    CashChangeListResult getWalletCashChangeDetails(Long userId);

    /**
     * 查询某只T0的体现详情
     *
     * @param userId   用户id，必选
     * @param fundCode 基金代碼，必选
     * @return
     */
    CashChangeListResult getWalletCashChangeDetails(final Long userId, final String fundCode);


    ShareListResult queryShareModels(Long userId, String fundCode);

    /**
     * 机构零钱提现
     * @param profileId
     * @param fundCode
     * @return
     */
    ShareListResult queryOrganShareModels(Long profileId, String fundCode);

    /**
     * 查询指定交易账号下的份额
     *
     * @param tradeAcco
     * @param fundCode
     * @return
     * @author spy
     * @version 2017-12-1 15:22:40
     */
    ShareListResult queryShareModels(String tradeAcco, String fundCode);


    /**
     * 查询T0的份额
     *
     * @param userId
     * @return
     */
    ShareListResult queryWalletShareModels(Long userId);


    /**
     * 通过基金代码获取基金详情
     *
     * @param userId
     * @param fundCode
     * @return
     */
    WalletDetailResult getWalletDetailByFundCode(Long userId, String fundCode) throws BaseAppException;


    /**
     * 获取当日用户的快赎次数
     *
     * @param userId
     * @param brandsType
     * @return
     */
    int getFastRedeemCountInCurrentDay(Long userId, String brandsType);

    /**
     * 增加当日的用户的快赎次数
     *
     * @param userId
     * @param brandsType
     * @return
     */
    int increaseFastRedeemCountInCurrentDay(Long userId, String brandsType);


    /**
     * 获取快速赎回当日已使用额度
     *
     * @param userId
     * @param brandsType
     * @return
     */
    BigDecimal getFastRedeemDayUsedMoney(Long userId, String brandsType);

    /**
     * 将当前交易增加到已使用限额
     *
     * @param userId
     * @param brandsType
     * @param money
     * @return
     */
    BigDecimal increaseFastRedeemDayUsedMoney(Long userId, String brandsType, BigDecimal money);

    //设置每日最高份额
    void setMaxLimit(WalletDetailResult result, List<Lookup> lookups, String fundCode, Boolean isOrg);

    void setWeekYield(SecurityProduct product, WalletDetailResult result);

    void setSellAndBuy(Boolean hasBalance, String fundCode, AssetFundModel wallet, WalletDetailResult result);
}
